Material UI is a Material Design library made for React.
It’s a set of React components that have Material Design styles.
In this article, we’ll look at how to add mobile steppers with Material UI.
Mobile Stepper
We can create a mobile stepper with the MobileStepper
component.
For instance, we can write:
import React from "react";
import MobileStepper from "@material-ui/core/MobileStepper";
import Typography from "@material-ui/core/Typography";
import Button from "@material-ui/core/Button";
import Paper from "@material-ui/core/Paper";
import KeyboardArrowRight from "@material-ui/icons/KeyboardArrowRight";
import KeyboardArrowLeft from "@material-ui/icons/KeyboardArrowLeft";
const steps = [
{
label: "cat 1",
imgPath: "http://placekitten.com/200/200"
},
{
label: "cat 2",
imgPath: "http://placekitten.com/199/199"
},
{
label: "cat 3",
imgPath: "http://placekitten.com/201/201"
}
];
export default function App() {
const [activeStep, setActiveStep] = React.useState(0);
const maxSteps = steps.length;
const handleNext = () => {
setActiveStep(prevActiveStep => prevActiveStep + 1);
};
const handleBack = () => {
setActiveStep(prevActiveStep => prevActiveStep - 1);
};
return (
<div>
<Paper square elevation={0}>
<Typography>{steps[activeStep].label}</Typography>
</Paper>
<img src={steps[activeStep].imgPath} alt={steps[activeStep].label} />
<MobileStepper
steps={maxSteps}
position="static"
variant="text"
activeStep={activeStep}
nextButton={
<Button
size="small"
onClick={handleNext}
disabled={activeStep === maxSteps - 1}
>
Next
<KeyboardArrowRight />
</Button>
}
backButton={
<Button size="small" onClick={handleBack} disabled={activeStep === 0}>
<KeyboardArrowLeft />
Back
</Button>
}
/>
</div>
);
}
to add a mobile stepper.
We used the MobileStepper
component to create the stepper.
The Paper
has the paper box for the text.
Then we have an image below that.
Then we have the MobileStepper
with the navigation buttons.
We pass in a button for the nextButtin
and backButton
props.
The next button calls the handleNext
function when it’s clicked.
The back button calls the handleBack
function when it’s clicked.
This will let us move to the next step and back respectively.
Carousel Effect
To make the stepper move through the slides automatically, w can add the AutoPlaySwipeableViews
component.
For example, we can write:
import React from "react";
import MobileStepper from "@material-ui/core/MobileStepper";
import Typography from "@material-ui/core/Typography";
import Button from "@material-ui/core/Button";
import Paper from "@material-ui/core/Paper";
import KeyboardArrowRight from "@material-ui/icons/KeyboardArrowRight";
import KeyboardArrowLeft from "@material-ui/icons/KeyboardArrowLeft";
import SwipeableViews from "react-swipeable-views";
import { autoPlay } from "react-swipeable-views-utils";
const AutoPlaySwipeableViews = autoPlay(SwipeableViews);
const steps = [
{
label: "cat 1",
imgPath: "http://placekitten.com/200/200"
},
{
label: "cat 2",
imgPath: "http://placekitten.com/199/199"
},
{
label: "cat 3",
imgPath: "http://placekitten.com/201/201"
}
];
export default function App() {
const [activeStep, setActiveStep] = React.useState(0);
const maxSteps = steps.length;
const handleNext = () => {
setActiveStep(prevActiveStep => prevActiveStep + 1);
};
const handleBack = () => {
setActiveStep(prevActiveStep => prevActiveStep - 1);
};
const handleStepChange = step => {
setActiveStep(step);
};
return (
<div>
<Paper square elevation={0}>
<Typography>{steps[activeStep].label}</Typography>
</Paper>
<AutoPlaySwipeableViews
axis="x"
index={activeStep}
onChangeIndex={handleStepChange}
enableMouseEvents
>
{steps.map((step, index) => (
<div key={step.label}>
{Math.abs(activeStep - index) <= 2 ? (
<img src={step.imgPath} alt={step.label} />
) : null}
</div>
))}
</AutoPlaySwipeableViews>
<MobileStepper
steps={maxSteps}
position="static"
variant="text"
activeStep={activeStep}
nextButton={
<Button
size="small"
onClick={handleNext}
disabled={activeStep === maxSteps - 1}
>
Next
<KeyboardArrowRight />
</Button>
}
backButton={
<Button size="small" onClick={handleBack} disabled={activeStep === 0}>
<KeyboardArrowLeft />
Back
</Button>
}
/>
</div>
);
}
to make the slides autoplay.
We added the react-swipeable-views and react-swipeable-views-utils libraries to let us add the autoplay capabilities.
The AutoPlaySwipeableViews
component we created from those libraries are added to our JSX code to make the view autoplay.
Progress Bar
We can add a progress bar if we have many steps.
To add a stepper with a progress bar, we can write:
import React from "react";
import MobileStepper from "@material-ui/core/MobileStepper";
import Button from "@material-ui/core/Button";
import KeyboardArrowRight from "@material-ui/icons/KeyboardArrowRight";
import KeyboardArrowLeft from "@material-ui/icons/KeyboardArrowLeft";
export default function App() {
const [activeStep, setActiveStep] = React.useState(0);
const handleNext = () => {
setActiveStep(prevActiveStep => prevActiveStep + 1);
};
const handleBack = () => {
setActiveStep(prevActiveStep => prevActiveStep - 1);
};
return (
<MobileStepper
variant="progress"
steps={10}
position="static"
activeStep={activeStep}
nextButton={
<Button size="small" onClick={handleNext} disabled={activeStep === 9}>
Next
<KeyboardArrowRight />
</Button>
}
backButton={
<Button size="small" onClick={handleBack} disabled={activeStep === 0}>
<KeyboardArrowLeft />
Back
</Button>
}
/>
);
}
We use the MobileStepper
component again.
The nextButton
and backButton
props are the same.
The difference is that we have the steps
prop.
We also have to disable the buttons when we reach the max step number for the next button.
And we do the same when we meet the min step number for the back button.
Conclusion
We can add mobile steppers for carousels or add a more compact stepper component.